/**
 * HTML实体转换工具
 */
export class HtmlEntity {
  private static entityMap: Record<string, string> = {
    '>': '&gt;',
    '<': '&lt;',
    '&': '&amp;',
    '"': '&quot;',
    '\'': '&apos;',
  }

  private static reverseEntityMap: Record<string, string> = Object.fromEntries(
    Object.entries(HtmlEntity.entityMap).map(([k, v]) => [v, k]),
  )

  /**
   * 判断字符串是否为HTML实体
   */
  static isEntity(str: string): boolean {
    return (
      // 检查是否是已知实体值（如 &gt;）
      str in HtmlEntity.reverseEntityMap
      // 检查是否是已知实体键（如 >）
      || str in HtmlEntity.entityMap
    )
  }

  /**
   * 解码 HTML 实体为普通字符
   */
  static decode(str: string): string {
    return str.replace(/&[a-z]{2,6};/g, match =>
      HtmlEntity.reverseEntityMap[match] || match)
  }

  /**
   * 编码特殊字符为 HTML 实体
   */
  static encode(str: string): string {
    return str.replace(/[><&"']/g, match =>
      HtmlEntity.entityMap[match] || match)
  }
}
